class Food {
}
class Fruit extends Food {
}
class Apple extends Fruit {
}
class Banana extends Fruit {
}
class Message<T> {
    private T message ;
    public T getMessage() {
        return message;
    }
    public void setMessage(T message) {
        this.message = message;
    }
}

public class Text {
    public static void main1(String[] args) {
        Message<String> message = new Message<>() ;
        message.setMessage("比特就业课欢迎您");
        fun1(message);

        Message<Integer> message2 = new Message<>() ;
        message2.setMessage(99999);
        fun1(message2);
    }

    public static void main2(String[] args) {
        Message<Apple> message1 = new Message<>();
        Message<Banana> message2 = new Message<>();
        fun2(message1);
        fun2(message2);
        System.out.println();
    }

    public static void main(String[] args) {
        Message<Food> message = new Message<>();
        fun(message);
        System.out.println();
    }
    // <? super Integer> 代表可以传入的实参的类型是Integer或者Integer的父类类型
    public static void fun(Message<? super Fruit> temp){
        //通配符的下界，不能进行读取数据，只能写入数据。

        //写入
        temp.setMessage(new Banana());
        temp.setMessage(new Apple());

        //读取
        //Fruit fruit = temp.getMessage();

    }

    // <? extends Number> 可以传入的实参类型是Number或者Number的子类
    /*public static void fun(Message<? extends Fruit> temp){
        Fruit fruit = temp.getMessage();
        //Apple apple = temp.getMessage();
        System.out.println(temp.getMessage());
    }*/
    // <? super Integer> 代表可以传入的实参的类型是Integer或者Integer的父类类型
    public static void fun2(Message<? extends Fruit> temp){

        Fruit fruit = temp.getMessage();
        //Apple apple = temp.getMessage();
    }
    public static void fun1(Message<?> temp){
        System.out.println(temp.getMessage());
    }
}
